package com.tom.baselibrary.dialog;

import android.view.View;
import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;

import java.lang.ref.WeakReference;

/**
 * Dialog View的辅助处理类。
 * 去掉public 不让外界调用
 */
class DialogViewHelper {

    private View mContentView = null;
    // 缓存找到的view，软引用防止内存泄漏。避免每次都FindViewById，消耗性能。
    private SparseArray<WeakReference<View>> mViews;

    public DialogViewHelper(Context context, int layoutResId) {
        this(); // 初始化mViews
        mContentView = LayoutInflater.from(context).inflate(layoutResId, null);
    }

    public DialogViewHelper() {
        mViews = new SparseArray();
    }

    public void setContentView(View contentView) {
        this.mContentView = contentView;
    }

    /**
     * 获取ContentView内容的view
     *
     * @return
     */
    public View getContentView() {
        return mContentView;
    }


    // 获取控件的公共方法
    public <T extends View> T getView(int viewId) {
        // 根据viewId，缓存view
        WeakReference<View> viewWeakReference = mViews.get(viewId);
        View view = null;
        if (viewWeakReference != null) {
            view = viewWeakReference.get(); // 软引用，要多一个get方法的调用。
        }

        if (view == null) {
            view = mContentView.findViewById(viewId);
            if (view != null) {
                mViews.put(viewId, new WeakReference<>(view)); // 软引用的view对象，添加到SparseArray。
            }
        }
        return (T) view;
    }

    // 设置文本， Button也是继承自TextView
    public void setText(int viewId, CharSequence text) {
        // 给控件设置文本，每次都findViewById，会比较麻烦。减少findViewById的次数。
        TextView textView = getView(viewId);
        if (textView != null) textView.setText(text);
    }

    // 设置点击事件
    public void setOnClickListener(int viewId, View.OnClickListener listener) {
        View view = getView(viewId);
        if (view != null) view.setOnClickListener(listener);
    }
}
